/**
 * @class ShareLog 分享日志模型
 */
const BaseMod = require('./base');
const Platform = require('./platform');
const Channel = require('./channel');
const SessionLog = require('./sessionLog');
const { DateTime } = require('../lib');
module.exports = class ShareLog extends BaseMod {
    constructor() {
        super();
        this.tableName = 'share-logs';
    }

    /**
     * 分析日志填充
     * @param {Object} reportParams 上报参数
     * @param {Object} sessionLogData 会话日志数据，此参数传递可减少数据库查询
     */
    async fill(reportParams, sessionLogData) {
        let params, sessionLogInfo, sessionKey;
        const fillParams = [];
        const sessionLog = new SessionLog();
        const platform = new Platform();
        const dateTime = new DateTime();
        const channel = new Channel();
        for (const rk in reportParams) {
            params = reportParams[rk];

            //暂存下会话数据，减少读库
            sessionKey = params.ak + params.did + params.p;
            if (!sessionLogData[sessionKey]) {
                // 会话日志
                sessionLogInfo = await sessionLog.getSession(params);
                if (sessionLogInfo.code) {
                    return sessionLogInfo;
                }
                if (this.debug) {
                    console.log('sessionLogInfo', JSON.stringify(sessionLogInfo));
                }
                sessionLogData[sessionKey] = sessionLogInfo;
            } else {
                sessionLogInfo = sessionLogData[sessionKey];
            }

            // 填充数据
            fillParams.push({
                appid: params.ak,
                version: params.v ? params.v : '',
                platform: platform.getPlatformCode(params.ut, params.p),
                channel: channel.getChannelCode(params),
                device_id: params.did,
                uid: params.uid ? params.uid : '',
                session_id: sessionLogInfo.data.sessionLogId,
                page_id: sessionLogInfo.data.pageId,
                create_time: dateTime.getTime(),
            });
        }

        if (fillParams.length === 0) {
            return {
                code: 200,
                msg: 'Invild param',
            };
        }

        const res = await this.insert(this.tableName, fillParams);
        if (res && res.inserted) {
            return {
                code: 0,
                msg: 'success',
            };
        } else {
            return {
                code: 500,
                msg: 'Filled error',
            };
        }
    }

    /**
     * 分享日志清理
     * @param {Number} days 保留天数
     */
    async clean(days) {
        days = Math.max(parseInt(days), 1);
        console.log('clean share logs - day:', days);

        const dateTime = new DateTime();

        const res = await this.delete(this.tableName, {
            create_time: {
                $lt: dateTime.getTimeBySetDays(0 - days),
            },
        });

        if (!res.code) {
            console.log('clean share log:', res);
        }
        return res;
    }
};
